#ifndef IGSLIB_IMARQUEE_H
#define IGSLIB_IMARQUEE_H
#include <map>
#include "igslib_common_use.h"
#include "igslib_iserial_manager.h"
#include "igslib_IGPIO.h"

namespace igslib
{
    struct LEDColor
    {
        unsigned char Red;
        unsigned char Green;
        unsigned char Blue;	
    };

    struct IMarquee:public IComponent
    {
        enum class State
        {
            idle,
            loading_group,
            loading_pattern,
        };
        /*!
         * 取得目前狀態。
         * @param 目前狀態。
         */
        virtual State GetState()=0;
        /*!
         * 設定要播放的燈光群組 。
         * @param a0 群組號碼。
         * @param a1 [true]表示只要播放一次。
         */
        virtual void RunGroup(int,bool)=0;
        /*!
         * 匯入燈光群組中的樣式資料。
         * @param a0 群組號碼。
         * @param a1 群組中樣式數量。
         * @param a2 樣式來源。
         */
        virtual void ImportGroup(int,int,unsigned char*)=0;
        /*!
         * 匯入燈光樣式資料。
         * @param a0 : 樣式號碼。
         * @param a1 : 樣式中所含LED數。
         * @param a2 : LED的顏色描述(三原色)。
         */
        virtual void ImportPattern(int,int,const LEDColor*)=0;
        /*!
         * 設定燈光樣式切換時間。
         * @param a0 燈光樣式切換時間 unit_time 依據專案。
         */
        virtual void SetPatternDuration(const float&)=0;
        /*!
         * 取得名。
         * @return 名。
         */			 
        virtual std::string GetName()=0;
        /*!
         * 重置
         */
        virtual void Reset()=0;
        /*!
         * 若實作是使用SPI通訊介面，用此函式輸入SPI的實作。
         * @param a0 SPI的實作。
         */
        virtual void SetSPI(ISpi*)=0;
		/*!
         * 設定Gray Level百分比0%~100%
         */
        virtual void SetDutyCycle(int)=0;
		/*!
         * 若實作是使用GPIO通訊介面，用此函式輸入GPIO的實作,使用帶IC的燈條或燈版。
         * @param a0 GPIO的實作
		 *			-- CLK 街腳
		 * @param a1 GPIO的實作
		 *			-- DATA 接腳。
		 * @param a2 GPIO的實作
		 *			-- LATCH 接腳，可為NULL (5026燈板使用)。
         */
		virtual void SetGPIO(IGPIO*,IGPIO*,IGPIO*)=0;	
		/*!
         * 若實作是使用GPIO通訊介面，用此函式輸入GPIO的實作,使用普通燈條。
         * @param a0 GPIO的實作
         */
		virtual void SetGPIO(IGPIO*)=0	;	
    };

    struct IMarqueeManager:public IManager<IMarquee*>
    {
		/*!
         * 創建MH主板上根據專案特規實作MCU資源。
         * @param a0 專案名。
         * @return 根據專案特規實作MCU資源。
         *     目前已實作專案名對照如下：
         *     "DragonBallRace"：龍珠賽球
         */
        virtual IMarquee* New_ProjMCU(const std::string&)=0;	
		
    };
};

extern "C"{
	igslib::IMarqueeManager* GetMarqueeManagerInstance();

	}


#endif

